package cn.tedu.ximart.server.repo.impl;


import cn.tedu.ximart.server.pojo.vo.BrandDetailVO;
import cn.tedu.ximart.server.pojo.vo.BrandListItemVO;
import cn.tedu.ximart.server.repo.IBrandRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Repository
public class
BrandRepositoryImpl implements IBrandRepository {

    @Autowired
    private RedisTemplate<String, Serializable> redisTemplate;

    public BrandRepositoryImpl(){

        System.out.println("BrandRepositoryImpl的构造方法被调用了");
    }

    @Override
    public void put(BrandDetailVO brandDetailVO) {
        log.debug("准备执行存入品牌对象数据的操作，接收到的数据为：{}",brandDetailVO);
        String key = KEY_PREFIX_BRAND_ITEM+brandDetailVO.getId();
        redisTemplate.opsForValue().set(key,brandDetailVO);
        log.debug("存入成功，存入数据的key={},value={}",key,brandDetailVO);
    }

    @Override
    public void deleteItem(Long id) {
        log.debug("准备执行根据id删除品牌对象数据的操作，接收到的id为：{}",id);
        String key = KEY_PREFIX_BRAND_ITEM+id;
        redisTemplate.delete(key);
    }

    @Override
    public void deleteList() {
        log.debug("准备执行删除品牌列表数据的操作");
        redisTemplate.delete(KEY_BRAND_LIST);
    }

    @Override
    public BrandDetailVO get(Long id) {
        log.debug("准备执行根据id获取品牌对象数据的操作，接收到的数据为：id={}",id);
        BrandDetailVO brand =null;
        String key = KEY_PREFIX_BRAND_ITEM + id;
        Serializable serializable = redisTemplate.opsForValue().get(key);
        //如果查询结果存在且属于BrandDetailVO,则进行强转后返回
        //否则返回null
        if(serializable!=null){
            if(serializable instanceof BrandDetailVO){
                brand = (BrandDetailVO) serializable;
            }
        }
        return brand;
    }

    @Override
    public void putList(List<BrandListItemVO> list) {
        log.debug("准备执行存入品牌对象数据列表的操作，接收到的数据为：{}",list);
        //遍历品牌列表，把每一个品牌对象存入到Redis中
        for(BrandListItemVO brandListItemVO:list){
            redisTemplate.opsForList().rightPush(KEY_BRAND_LIST,brandListItemVO);
        }
    }

    @Override
    public List<BrandListItemVO> getList() {
        log.debug("准备执行获取品牌对象数据列表的操作");
        //获取品牌列表list，0~-1表示全部元素
        List<Serializable> list = redisTemplate.opsForList().range(KEY_BRAND_LIST,0,-1);
        //遍历list，得到每一个元素并强转，放入到新建的brands集合中，然后返回
        List<BrandListItemVO> brands = new ArrayList<>();
        for (Serializable serializable : list) {
            brands.add((BrandListItemVO) serializable);
        }
        return brands;
    }
}
